    
/**
 * Project Name:UIMS
 * File Name:UserService.java
 * Package Name:com.bgi.uims.module.sys.User.service
 * CreateDate:2015年3月24日 下午9:43:30
 * Copyright (c) 2015, BGI_DX All Rights Reserved.
 */     

package com.bgi.uims.module.sys.user.service;



import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.bgi.uims.common.dao.ICommonDao;
import com.bgi.uims.common.dto.PageVo;
import com.bgi.uims.module.sys.portal.dto.UserDesktop;
import com.bgi.uims.module.sys.role.dto.SysRoles;
import com.bgi.uims.module.sys.user.dto.Roles;
import com.bgi.uims.module.sys.user.dto.User;
import com.bgi.uims.pub.utils.Constant;

/**
 * ClassName:UserService
 * Function: TODO 
 * Reason:	 TODO 
 * @CreateDate:2015年3月25日 下午9:43:30
 * @author   tantianhua
 * @version  
 * @since    JDK 1.7
 * @see 	 
 */
@Service
@Transactional
public class UserService {



	@Resource
	private ICommonDao commonDao;
	
	/**
	 * @Description：  查询用户信息
	 * @author: tantianhua
	 * @CreateDate:2015年3月25日 上午10:19:52
	 * @version: V1.0
	 */
	@SuppressWarnings("unchecked")
	public PageVo queryUser(User user) {
		// TODO Auto-generated method stub
		user.setQuerySql(Constant.SQL_QUERY_USER);
		//未设置页码，默认不分页
		PageVo page=commonDao.query(user);
		
		if(user.getUserId() != null){
			user.setQuerySql(Constant.SQL_QUERY_USERROLES);
			PageVo pageVo = commonDao.query(user);
			List <Roles>results = pageVo.getRows();
			StringBuilder ManagesRole = new StringBuilder();
			for(Roles userRoles:results){
				ManagesRole.append(userRoles.getRolesName()+",");
			}	
			page.setObject(ManagesRole.toString());
		}
		
		return page;
	}

	/**
	 * @Description：  保存用户信息
	 * @author: tantianhua
	 * @CreateDate:2015年3月25日 上午10:19:52
	 * @version: V1.0
	 */
	@SuppressWarnings("unchecked")
	public PageVo saveUser(User user) {
		// TODO Auto-generated method stub
		PageVo pageVo=new PageVo(); 
		if(user.getUserId()!=null&&!"".equals(user.getUserId()))
		{
			user.setUpdateSql(Constant.SQL_UPDATE_USER);
			if(commonDao.update(user)>0)
			{
				
				if (user.getManageRole() != null){
					if("".endsWith(user.getManageRole())){
						user.setManageRoleArray(new String[0]);
					} else {
						user.setManageRoleArray(user.getManageRole().split("\\#"));
					}
					//先查询出该用户之前的角色配置信息
					user.setQuerySql(Constant.SQL_QUERY_USERROLES);
					PageVo oldRolepageVo = commonDao.query(user);
					List<Roles> oldRoles = oldRolepageVo.getRows();
					//查出用户修改角色配置的信息
					List<SysRoles> newRoles = new ArrayList<SysRoles>();
					if(user.getManageRoleArray().length > 0){
						SysRoles seachRole = new SysRoles();
						seachRole.setRolesIds(user.getManageRoleArray());
						seachRole.setQuerySql(Constant.SQL_QUERY_ROLES_BYIDS);
						newRoles = commonDao.query(seachRole).getRows();
					} 
					
					user.setUpdateSql(Constant.SQL_DELETE_USERROLES);
					commonDao.update(user);
					if(user.getManageRoleArray().length > 0){
						user.setInsertSql(Constant.SQL_INSERT_USERROLE);
						user.setUserId(user.getUserId());
						commonDao.insert(user);
					}
					//对修改进行比较，比较信息放到历史记录里，保存到操作日志里。
					Map<String,String> extendHistory = new HashMap<String,String>();
					StringBuilder deleteMenu = new StringBuilder();
					StringBuilder addMenu = new StringBuilder();
					for(SysRoles newRole:newRoles){
						boolean addFlag = true;
						for(Roles oldRole:oldRoles){
							if(newRole.getRolesId().equals(oldRole.getRolesId())){
								addFlag = false;
								break;
							}
						}
						if(addFlag){
							addMenu.append(newRole.getRolesName()+",");
						}
					}
					for(Roles oldRole:oldRoles){
						boolean deleteFlag = true;
						for(SysRoles newRole:newRoles){
							if(newRole.getRolesId().equals(oldRole.getRolesId())){
								deleteFlag = false;
								break;
							} 
						}
						if(deleteFlag){
							deleteMenu.append(oldRole.getRolesName()+",");
						}
					}
					extendHistory.put("extends", "true");
					extendHistory.put("object","用户");//必须有,对象描述
					extendHistory.put("table","sys_user");//必须有,表名描述
					extendHistory.put("tableId",user.getUserId());//必须有,表名描述
					extendHistory.put("describe","角色的资源授权");//必须有,可以指定到具体某一条，即该条的独有特性,可以描述此记录
					if(!"".equals(deleteMenu.toString())){
						extendHistory.put("取消角色名称", deleteMenu.toString());
					}
					if(!"".equals(addMenu.toString())){
						extendHistory.put("添加角色名称", addMenu.toString());
					}
					user.setSpecialHistory(extendHistory);
				}
				pageVo.setSuccess(true);
			}
			else
			{
				pageVo.setSuccess(false);
				pageVo.setMsg("未更新到数据!");
			}
		}
		else{
			//先验证是否已存在
			user.setQueryOneSql(Constant.SQL_QUERY_VERIFY_USERNAME);
			Integer i=(Integer) commonDao.queryOne(user);
			if(i>0)
			{
				pageVo.setSuccess(false);
				pageVo.setMsg("用户名已存在!");
			}else{
				user.setQueryOneSql(Constant.SQL_QUERY_VERIFY_WORKNUM);
				Integer j =(Integer) commonDao.queryOne(user);
				if(j>0){
					pageVo.setSuccess(false);
					pageVo.setMsg("工号已存在!");
				}else{
					user.setQueryOneSql(Constant.SQL_QUERY_VERIFY_EMAIL);
					Integer k =(Integer) commonDao.queryOne(user);
					if(k>0)
					{
						pageVo.setSuccess(false);
						pageVo.setMsg("邮箱已存在!");
					}else{

						user.setInsertSql(Constant.SQL_INSERT_USER);
						String userId = (String) commonDao.insert(user);
						UserDesktop ud = new UserDesktop();
						ud.setUserId(userId);
						ud.setOrderData("[[\"pd_noticePanel\"]]");
						ud.setInsertSql(Constant.SQL_INSERT_USERDESKTOP);
						commonDao.insert(ud);
						if (user.getManageRole() != null && !"".endsWith(user.getManageRole())){
							user.setManageRoleArray(user.getManageRole().split("\\#"));
							user.setInsertSql(Constant.SQL_INSERT_USERROLE);
							user.setUserId(userId);
							commonDao.insert(user);
						}
						pageVo.setSuccess(true);
					}
				}
			}	
		}
		return pageVo;
	}

	/**
	 * @Description：  删除用户信息
	 * @author: tantianhua
	 * @CreateDate:2015年3月25日 上午10:19:52
	 * @version: V1.0
	 */
	public boolean deleteUser(User user) {
		user.setUpdateSql(Constant.SQL_DELETE_USER);
		commonDao.update(user);
		return true;
	}
	
	/**
	 * @Description：  删除用户角色
	 * @author: tantianhua
	 * @CreateDate:2015年3月25日 上午10:19:52
	 * @version: V1.0
	 */
	public void deleteUserRoles(User user) {
		user.setUpdateSql(Constant.SQL_DELETE_USERROLES);
		commonDao.update(user);
		user.setUpdateSql(Constant.SQL_DELETE_USERPORTAL);
		commonDao.update(user);
		
	}

	/**
	 * @Description：  查询单个用户信息
	 * @author: tantianhua
	 * @CreateDate:2015年3月25日 上午10:19:52
	 * @version: V1.0
	 */
	@SuppressWarnings("unchecked")	
	public User findUserById(User user) {
		// TODO Auto-generated method stub
		user.setQueryOneSql(Constant.SQL_QUERY_USERBYID);
		user=(User) commonDao.queryOne(user);
		if(user != null){
			user.setQuerySql(Constant.SQL_QUERY_USERROLES);
			PageVo pageVo = commonDao.query(user);
			List<Roles> results = pageVo.getRows();
			StringBuilder ManagesRole = new StringBuilder();
			for(Roles userRoles:results){
				ManagesRole.append(userRoles.getRolesId()+"#");
			}
			user.setManageRole(ManagesRole.toString());
			user.setManageRoleArray(ManagesRole.toString().split("\\#"));			
		 }
		return user;
	}
	
	/**
	 * @Description：  查询用户是否存在
	 * @author: liduo
	 * @version: V1.0
	 */	
	public User isUserExist(User user) {
		user.setQueryOneSql(Constant.SQL_QUERY_USERBYUSERNAME);
		user=(User)commonDao.queryOne(user);
		return user;
	}	

	/**
	 * @Description：  更新用户状态
	 * @author: tantianhua
	 * @CreateDate:2015年3月25日 上午10:19:52
	 * @version: V1.0
	 */
	public String updateUserStatus(User user) {
		String result=null;
		user.setUpdateSql(Constant.SQL_UPDATE_USERSTATUS);
		Integer count=commonDao.update(user);
		if(count==0)
			result=Constant.ERROR_CODE_102;
		return result;
	}
 
	/**
	 * @Description：  查询用户角色
	 * @author: tantianhua
	 * @CreateDate:2015年3月25日 上午10:19:52
	 * @version: V1.0
	 */
	public PageVo queryUserRoles(User user) {
		// TODO Auto-generated method stub
		user.setQuerySql(Constant.SQL_QUERY_USERROLES);
		//未设置页码，默认不分页
		PageVo page=commonDao.query(user);
		return page;
	}
	
	/**
	 * @Description：  查询角色
	 * @author: tantianhua
	 * @CreateDate:2015年3月25日 上午10:19:52
	 * @version: V1.0
	 */
	public PageVo queryRolesId(Roles roles) {
		PageVo pagevo=new PageVo();
		roles.setQuerySql(Constant.SQL_QUERY_ROLESID);
		pagevo=commonDao.query(roles);
		return pagevo;
	}
	
	//登陆
	public User login(User user){
		//验证的SQL ID
		user.setQueryOneSql(Constant.SQL_QUERY_USERBYUSERNAME);
		User loginUser=(User) commonDao.queryOne(user);
		if(loginUser!=null)
		{
			loginUser.setQueryOneSql(Constant.SQL_QUERY_USER_ROLESID_BYUSERID);
			loginUser.setRolesId((String)commonDao.queryOne(loginUser));
			//验证用户状态
			if("1".equals(loginUser.getAccountCount()))
			{
				//用户存在，验证密码		
				//邮箱验证
//				boolean bool=ClientService.getClientService(ConfigConst.getAUTH_EMAIL()).emailLogin(user.getUserName(), user.getPassWord());
				boolean bool=true;
				if(bool){
					//
					//登录成功
					//密码注掉
					loginUser.setPassWord(null);
					//登录次数+1
					//登录次数+1
					//更新数据库
					loginUser.setUpdateSql(Constant.SQL_UPDATE_LOGINUSERCOUNT);
					commonDao.update(loginUser);
					loginUser.setUserCount(loginUser.getUserCount()==null?1:loginUser.getUserCount()+1);
					loginUser.setQueryOneSql(Constant.ERROR_CODE_101);//此处作为成功
				}
				else{
					//密码错误
					loginUser.setQueryOneSql(Constant.ERROR_CODE_102);//作为返回参数
				}
			}
			else
			{
				//账号已禁用
				loginUser.setQueryOneSql(Constant.ERROR_CODE_103);
			}
			
		}
		else
		{
			loginUser=new User();
			//登录失败，用户名不存在
			loginUser.setQueryOneSql(Constant.ERROR_CODE_104);
		}
		return loginUser;
	}

	/**  
	 * @Description：更新最后一次登录时间
	 * @author: tantianhua
	 * @CreateDate:2015年3月31日 下午3:32:38
	 * @version: V1.0 
	 */   
	
	public void updateUserLoginTime(User user) {
		user.setUpdateSql(Constant.SQL_UPDATE_USERLASTTIME);
		commonDao.update(user);
	}
	
	/**
	 * 
	 * @Description：  统计系统登录的次数
	 * @author: wuyaohong
	 * @CreateDate:2015年4月1日 上午10:07:12
	 * @version: V1.0
	 */
	public PageVo getUserLoginCount(){
		Calendar calendar = Calendar.getInstance();
		String year = calendar.get(Calendar.YEAR) + "";
		User user = new User();
		user.setCountYear(year);
		user.setQuerySql(Constant.SQL_QUERY_LOGINUSERCOUNT);
		return commonDao.query(user);
	}
	
}
